package com.ssyt.yt1.day18;

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.util.Vector;

/**
 * 1、内存泄漏的问题<br/>
 * 一个本该被回收的对象，GC无法对其回收<br/>
 * 2、在Java语言中，判断一个内存空间是否符合垃圾收集标准有两个：<br/>
 * 1) 一个是给对象赋予了空值null，以下再没有调用过<br/>
 * 2) 另一个是给对象赋予了新值， 这样重新分配了内存空间。<br/>
 * 
 * @author Administrator
 *
 */
public class MemoryLeakDemo {

	/**
	 * 一个是给对象赋予了空值null，以下再没有调用过
	 */
	public static void test1() {
		Object object = new Object();
		object = null;
		// 后续还是几十行复杂的代码，而后续代码并没有使用到object,那么在之前最好就把object=null,让GC快速回收...
	}

	/**
	 * 另一个是给对象赋予了新值， 这样重新分配了内存空间。
	 */
	public static void test2() {
		Object obj1 = new Object();
		Object obj2 = new Object();
		obj2 = obj1;
	}

	/**
	 * 别以为o对象被回收了，实际上v引用了这些对象，还被引用的对象GC是没有办法回收的，这样就很可能导致内存的泄露。
	 */
	static Vector v;

	public static void test3() {
		v = new Vector();
		for (int i = 1; i < 100; i++) {
			Object o = new Object();
			v.add(o);
			o = null;
		}
	}

	/**
	 * Scanner
	 * 
	 * @throws FileNotFoundException
	 * @throws InterruptedException
	 */
	public static void test4() throws FileNotFoundException,
			InterruptedException {
		Scanner scanner = null;
		try {
			scanner = new Scanner(new File("G:\\a.txt"));
			StringBuilder sb = new StringBuilder();
			while (scanner.hasNext()) {
				sb.append(scanner.next());
			}
		} finally {
			if (scanner != null) {
				scanner.close();
			}
		}
	}

	public static void main(String[] args) throws FileNotFoundException,
			InterruptedException {
		// test3();
		test4();
	}
}
